/*
 * FreeRTOS Kernel V10.3.1
 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *
 * http://www.FreeRTOS.org
 * http://aws.amazon.com/freertos
 *
 * 1 tab == 4 spaces!
 */

#ifndef MPU_WRAPPERS_H
#define MPU_WRAPPERS_H

/* This file redefines API functions to be called through a wrapper macro, but
only for ports that are using the MPU. */
#ifdef portUSING_MPU_WRAPPERS

/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is
included from queue.c or task.c to prevent it from having an effect within
those files. */
#    ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE

/*
 * Map standard (non MPU) API functions to equivalents that start
 * "MPU_".  This will cause the application code to call the MPU_
 * version, which wraps the non-MPU version with privilege promoting
 * then demoting code, so the kernel code always runs will full
 * privileges.
 */

/* Map standard tasks.h API functions to the MPU equivalents. */
#        define xTaskCreate MPU_xTaskCreate
#        define xTaskCreateStatic MPU_xTaskCreateStatic
#        define xTaskCreateRestricted MPU_xTaskCreateRestricted
#        define vTaskAllocateMPURegions MPU_vTaskAllocateMPURegions
#        define vTaskDelete MPU_vTaskDelete
#        define vTaskDelay MPU_vTaskDelay
#        define vTaskDelayUntil MPU_vTaskDelayUntil
#        define xTaskAbortDelay MPU_xTaskAbortDelay
#        define uxTaskPriorityGet MPU_uxTaskPriorityGet
#        define eTaskGetState MPU_eTaskGetState
#        define vTaskGetInfo MPU_vTaskGetInfo
#        define vTaskPrioritySet MPU_vTaskPrioritySet
#        define vTaskSuspend MPU_vTaskSuspend
#        define vTaskResume MPU_vTaskResume
#        define vTaskSuspendAll MPU_vTaskSuspendAll
#        define xTaskResumeAll MPU_xTaskResumeAll
#        define xTaskGetTickCount MPU_xTaskGetTickCount
#        define uxTaskGetNumberOfTasks MPU_uxTaskGetNumberOfTasks
#        define pcTaskGetName MPU_pcTaskGetName
#        define xTaskGetHandle MPU_xTaskGetHandle
#        define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark
#        define uxTaskGetStackHighWaterMark2 MPU_uxTaskGetStackHighWaterMark2
#        define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag
#        define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag
#        define vTaskSetThreadLocalStoragePointer \
            MPU_vTaskSetThreadLocalStoragePointer
#        define pvTaskGetThreadLocalStoragePointer \
            MPU_pvTaskGetThreadLocalStoragePointer
#        define xTaskCallApplicationTaskHook MPU_xTaskCallApplicationTaskHook
#        define xTaskGetIdleTaskHandle MPU_xTaskGetIdleTaskHandle
#        define uxTaskGetSystemState MPU_uxTaskGetSystemState
#        define vTaskList MPU_vTaskList
#        define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats
#        define ulTaskGetIdleRunTimeCounter MPU_ulTaskGetIdleRunTimeCounter
#        define xTaskGenericNotify MPU_xTaskGenericNotify
#        define xTaskNotifyWait MPU_xTaskNotifyWait
#        define ulTaskNotifyTake MPU_ulTaskNotifyTake
#        define xTaskNotifyStateClear MPU_xTaskNotifyStateClear
#        define ulTaskNotifyValueClear MPU_ulTaskNotifyValueClear
#        define xTaskCatchUpTicks MPU_xTaskCatchUpTicks

#        define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle
#        define vTaskSetTimeOutState MPU_vTaskSetTimeOutState
#        define xTaskCheckForTimeOut MPU_xTaskCheckForTimeOut
#        define xTaskGetSchedulerState MPU_xTaskGetSchedulerState

/* Map standard queue.h API functions to the MPU equivalents. */
#        define xQueueGenericSend MPU_xQueueGenericSend
#        define xQueueReceive MPU_xQueueReceive
#        define xQueuePeek MPU_xQueuePeek
#        define xQueueSemaphoreTake MPU_xQueueSemaphoreTake
#        define uxQueueMessagesWaiting MPU_uxQueueMessagesWaiting
#        define uxQueueSpacesAvailable MPU_uxQueueSpacesAvailable
#        define vQueueDelete MPU_vQueueDelete
#        define xQueueCreateMutex MPU_xQueueCreateMutex
#        define xQueueCreateMutexStatic MPU_xQueueCreateMutexStatic
#        define xQueueCreateCountingSemaphore MPU_xQueueCreateCountingSemaphore
#        define xQueueCreateCountingSemaphoreStatic \
            MPU_xQueueCreateCountingSemaphoreStatic
#        define xQueueGetMutexHolder MPU_xQueueGetMutexHolder
#        define xQueueTakeMutexRecursive MPU_xQueueTakeMutexRecursive
#        define xQueueGiveMutexRecursive MPU_xQueueGiveMutexRecursive
#        define xQueueGenericCreate MPU_xQueueGenericCreate
#        define xQueueGenericCreateStatic MPU_xQueueGenericCreateStatic
#        define xQueueCreateSet MPU_xQueueCreateSet
#        define xQueueAddToSet MPU_xQueueAddToSet
#        define xQueueRemoveFromSet MPU_xQueueRemoveFromSet
#        define xQueueSelectFromSet MPU_xQueueSelectFromSet
#        define xQueueGenericReset MPU_xQueueGenericReset

#        if (configQUEUE_REGISTRY_SIZE > 0)
#            define vQueueAddToRegistry MPU_vQueueAddToRegistry
#            define vQueueUnregisterQueue MPU_vQueueUnregisterQueue
#            define pcQueueGetName MPU_pcQueueGetName
#        endif

/* Map standard timer.h API functions to the MPU equivalents. */
#        define xTimerCreate MPU_xTimerCreate
#        define xTimerCreateStatic MPU_xTimerCreateStatic
#        define pvTimerGetTimerID MPU_pvTimerGetTimerID
#        define vTimerSetTimerID MPU_vTimerSetTimerID
#        define xTimerIsTimerActive MPU_xTimerIsTimerActive
#        define xTimerGetTimerDaemonTaskHandle \
            MPU_xTimerGetTimerDaemonTaskHandle
#        define xTimerPendFunctionCall MPU_xTimerPendFunctionCall
#        define pcTimerGetName MPU_pcTimerGetName
#        define vTimerSetReloadMode MPU_vTimerSetReloadMode
#        define uxTimerGetReloadMode MPU_uxTimerGetReloadMode
#        define xTimerGetPeriod MPU_xTimerGetPeriod
#        define xTimerGetExpiryTime MPU_xTimerGetExpiryTime
#        define xTimerGenericCommand MPU_xTimerGenericCommand

/* Map standard event_group.h API functions to the MPU equivalents. */
#        define xEventGroupCreate MPU_xEventGroupCreate
#        define xEventGroupCreateStatic MPU_xEventGroupCreateStatic
#        define xEventGroupWaitBits MPU_xEventGroupWaitBits
#        define xEventGroupClearBits MPU_xEventGroupClearBits
#        define xEventGroupSetBits MPU_xEventGroupSetBits
#        define xEventGroupSync MPU_xEventGroupSync
#        define vEventGroupDelete MPU_vEventGroupDelete

/* Map standard message/stream_buffer.h API functions to the MPU
equivalents. */
#        define xStreamBufferSend MPU_xStreamBufferSend
#        define xStreamBufferReceive MPU_xStreamBufferReceive
#        define xStreamBufferNextMessageLengthBytes \
            MPU_xStreamBufferNextMessageLengthBytes
#        define vStreamBufferDelete MPU_vStreamBufferDelete
#        define xStreamBufferIsFull MPU_xStreamBufferIsFull
#        define xStreamBufferIsEmpty MPU_xStreamBufferIsEmpty
#        define xStreamBufferReset MPU_xStreamBufferReset
#        define xStreamBufferSpacesAvailable MPU_xStreamBufferSpacesAvailable
#        define xStreamBufferBytesAvailable MPU_xStreamBufferBytesAvailable
#        define xStreamBufferSetTriggerLevel MPU_xStreamBufferSetTriggerLevel
#        define xStreamBufferGenericCreate MPU_xStreamBufferGenericCreate
#        define xStreamBufferGenericCreateStatic \
            MPU_xStreamBufferGenericCreateStatic

/* Remove the privileged function macro, but keep the PRIVILEGED_DATA
macro so applications can place data in privileged access sections
(useful when using statically allocated objects). */
#        define PRIVILEGED_FUNCTION
#        define PRIVILEGED_DATA __attribute__((section("privileged_data")))
#        define FREERTOS_SYSTEM_CALL

#    else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */

/* Ensure API functions go in the privileged execution section. */
#        define PRIVILEGED_FUNCTION \
            __attribute__((section("privileged_functions")))
#        define PRIVILEGED_DATA __attribute__((section("privileged_data")))
#        define FREERTOS_SYSTEM_CALL \
            __attribute__((section("freertos_system_calls")))

#    endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */

#else /* portUSING_MPU_WRAPPERS */

#    define PRIVILEGED_FUNCTION
#    define PRIVILEGED_DATA
#    define FREERTOS_SYSTEM_CALL
#    define portUSING_MPU_WRAPPERS 0

#endif /* portUSING_MPU_WRAPPERS */

#endif /* MPU_WRAPPERS_H */
